
/*
 * @lc app=leetcode.cn id=680 lang=cpp
 *
 * [680] 验证回文字符串 Ⅱ
 *
 * https://leetcode-cn.com/problems/valid-palindrome-ii/description/
 *
 * algorithms
 * Easy (40.08%)
 * Likes:    482
 * Dislikes: 0
 * Total Accepted:    105.6K
 * Total Submissions: 263.5K
 * Testcase Example:  '"aba"'
 *
 * 给定一个非空字符串 s，最多删除一个字符。判断是否能成为回文字符串。
 *
 *
 *
 * 示例 1:
 *
 *
 * 输入: s = "aba"
 * 输出: true
 *
 *
 * 示例 2:
 *
 *
 * 输入: s = "abca"
 * 输出: true
 * 解释: 你可以删除c字符。
 *
 *
 * 示例 3:
 *
 *
 * 输入: s = "abc"
 * 输出: false
 *
 *
 *
 * 提示:
 *
 *
 * 1
 * s 由小写英文字母组成
 *
 *
 */

// @lc code=start
#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
    bool validPalindrome(string s) {
        int n = s.length();
        int left = 0, right = n - 1;
        bool able_to_del = true;
        while (left <= right) {
            if (s[left] == s[right]) {
                ++left;
                --right;
            }
            else if (able_to_del) {
                if (s[left + 1] == s[right] && s[left] == s[right - 1]) {
                    int temp_l1 = left + 1, temp_r1 = right;
                    while (temp_l1 <= temp_r1) {
                        if (s[temp_l1] == s[temp_r1]) {
                            ++temp_l1;
                            --temp_r1;
                        }
                        else {
                            break;
                        }
                    }
                    if (temp_l1 >= temp_r1) {
                        return true;
                    }
                    int temp_l2 = left, temp_r2 = right - 1;
                    while (temp_l2 <= temp_r2) {
                        if (s[temp_l2] == s[temp_r2]) {
                            ++temp_l2;
                            --temp_r2;
                        }

                        else {
                            break;
                        }
                    }
                    if (temp_l2 >= temp_r2) {
                        return true;
                    }
                    return false;
                }
                else if (s[left + 1] == s[right] && s[left] != s[right - 1]) {
                    ++left;
                    able_to_del = false;
                }
                else if (s[left + 1] != s[right] && s[left] == s[right - 1]) {
                    --right;
                    able_to_del = false;
                }
                else {
                    return false;
                }
            }
            else {
                return false;
            }
        }
        return true;
    }
};

// @lc code=end
